package com.renbiao.pojo;

/*
 * 双重检查的形式创建单例对象
 * */
public class VolleyBall {

    //构造器私有化
    private VolleyBall() {
    }

    //声明单例对象
    private static VolleyBall vb;

    /*
     * 处理方式1：使用同步方法
     *   我们可以将取得的单例对象的方法进行同步的操作，将该方法改造为同步方法
     *   问题：访问该方法，可以让对个线程一起访问
     *       如果将该方法改变成为同步方法，在取得该单例对象的时候，就只能一个线程一个线程的排队取得单例对象，会大大降低效率
     *
     * 处理方式2：使用synchronized同步块的方法
     *   将方法从同步方法该为非同步方法，使用synchronized同步块的形式来操作if语句
     *   虽然多个线程同时访问到该方法，但是仍然是在同步代码块的代码上进行排队等候，实质上与同步方法没有区别，降低程序的访问效率
     *
     * 处理方式3：使用双重检查来解决问题
     *   进行两次if判断
     *      第一次的判断没有涉及到同步代码块， 不会造成线程排队来取对象的问题
     *      第二次的判断是为了让并发的线程没有机会创建第二个对象的可能
     * */

//    public synchronized static VolleyBall getVolleyBall(){
//            //方法1:同步方法
//        if (vb == null){
//            vb = new VolleyBall();
//        }
//        return vb;
//    }

//    public static VolleyBall getVolleyBall(){
//
//        //方法2：synchronized同步块
//        synchronized (VolleyBall.class){
//            if (vb == null){
//                vb = new VolleyBall();
//            }
//        }
//        return vb;
//    }

    public static VolleyBall getVolleyBall() {

        //方法3：双重检查
        if (vb == null) {
            synchronized (VolleyBall.class) {
                if (vb == null) {
                    vb = new VolleyBall();
                }
            }
        }
        return vb;
    }

}
